package utils.sl651;
/**
 * SL651-2014水文监测数据通信规约数据结构定义
 * 
 * 根据SL651-2014标准定义协议常量和数据结构
 */
public class SL651Protocol {
    
    // 协议控制字符
    public static final byte SOH = 0x01;  // 起始符
    public static final byte STX = 0x02;  // 数据开始符
    public static final byte ETX = 0x03;  // 数据结束符
    public static final byte ESC = 0x1B;  // 退出链路符
    
    // 功能码定义 - 根据SL651-2014附录B表B.1
    public static final String FUNC_LINK_MAINTAIN = "2F";      // 链路维持报文
    public static final String FUNC_TEST_REPORT = "30";        // 测试报文
    public static final String FUNC_EVEN_TIME_REPORT = "31";   // 均匀时段水文信息报
    public static final String FUNC_TIMER_REPORT = "32";       // 遥测站定时报
    public static final String FUNC_ADD_REPORT = "33";         // 遥测站加报报
    public static final String FUNC_HOUR_REPORT = "34";        // 遥测站小时报
    public static final String FUNC_ARTIFICIAL_REPORT = "35";  // 遥测站人工置数报
    public static final String FUNC_PICTURE_REPORT = "36";     // 遥测站图片报
    public static final String FUNC_QUERY_REALTIME = "37";     // 中心站查询遥测站实时数据
    public static final String FUNC_QUERY_PERIOD = "38";       // 中心站查询遥测站时段数据
    public static final String FUNC_QUERY_ARTIFICIAL = "39";   // 中心站查询遥测站人工置数
    public static final String FUNC_QUERY_ELEMENT = "3A";      // 中心站查询遥测站指定要素数据
    
    // 下行功能码
    public static final String FUNC_MODIFY_CONFIG = "40";      // 中心站修改遥测站基本配置表
    public static final String FUNC_READ_CONFIG = "41";        // 中心站读取遥测站基本配置表
    public static final String FUNC_MODIFY_PARAM = "42";       // 中心站修改遥测站运行参数配置表
    public static final String FUNC_READ_PARAM = "43";         // 中心站读取遥测站运行参数配置表
    public static final String FUNC_QUERY_PUMP = "44";         // 查询水泵电机实时工作数据
    public static final String FUNC_QUERY_VERSION = "45";      // 查询遥测终端软件版本
    public static final String FUNC_QUERY_STATUS = "46";       // 查询遥测站状态和报警信息
    public static final String FUNC_INIT_STORAGE = "47";       // 初始化固态存储数据
    public static final String FUNC_FACTORY_RESET = "48";      // 恢复终端出厂设置
    public static final String FUNC_MODIFY_PASSWORD = "49";    // 修改密码
    public static final String FUNC_SET_CLOCK = "4A";          // 设置遥测站时钟
    public static final String FUNC_SET_IC_CARD = "4B";        // 设置遥测终端IC卡状态
    public static final String FUNC_CONTROL_PUMP = "4C";       // 控制水泵开关命令/水泵状态信息自报
    public static final String FUNC_CONTROL_VALVE = "4D";      // 控制阀门开关命令/阀门状态信息自报
    public static final String FUNC_CONTROL_GATE = "4E";       // 控制闸门开关命令/闸门状态信息自报
    public static final String FUNC_WATER_CONTROL = "4F";      // 水量定值控制命令
    public static final String FUNC_QUERY_EVENT = "50";        // 中心站查询遥测站事件记录
    public static final String FUNC_QUERY_CLOCK = "51";        // 中心站查询遥测站时钟
    
    // 侧缝计专用功能码 (自定义扩展区E0H-FFH)
    public static final String FUNC_SIDE_SEW_TIMER = "D0";     // 侧缝计定时报告
    public static final String FUNC_SIDE_SEW_ADD = "D1";       // 侧缝计加报报告
    public static final String FUNC_SIDE_SEW_ARTIFICIAL = "D2"; // 侧缝计人工报告
    public static final String FUNC_SIDE_SEW_PARAM_SET = "D3"; // 侧缝计参数设置
    public static final String FUNC_SIDE_SEW_STATUS = "D4";    // 侧缝计状态查询
    public static final String FUNC_SIDE_SEW_CALIBRATE = "D5"; // 侧缝计校准指令
    
    // 扩展功能码定义
    public static final String FUNC_WATER_PUMP = "E0";        // 水泵状态报文
    public static final String FUNC_GATE = "E1";              // 闸门状态报文
    
    // 数据元素标识符
    public static final String ELEM_STATION_ID = "ST";         // 遥测站地址
    public static final String ELEM_STATION_TYPE = "H";        // 遥测站分类码
    public static final String ELEM_OBSERVE_TIME = "TT";       // 观测时间标识符
    public static final String ELEM_CURRENT_RAINFALL = "PJ";   // 当前降水量
    public static final String ELEM_TOTAL_RAINFALL = "PT";     // 降水量累计值
    public static final String ELEM_WATER_LEVEL = "Z";         // 瞬时河道水位
    public static final String ELEM_FLOW_RATE = "Q";           // 瞬时流量
    public static final String ELEM_VOLTAGE = "VT";            // 电源电压
    public static final String ELEM_WATER_TEMP = "TW";         // 水温
    public static final String ELEM_PH = "pH";                 // PH值
    public static final String ELEM_DISSOLVED_OXYGEN = "DO";   // 溶解氧
    public static final String ELEM_CONDUCTIVITY = "COND";     // 电导率
    public static final String ELEM_TURBIDITY = "TU";          // 浊度
    public static final String ELEM_5MIN_RAINFALL = "DRP";     // 1小时内5分钟间隔雨量
    public static final String ELEM_5MIN_WATER_LEVEL = "DRZ1"; // 1小时内5分钟间隔相对水位
    public static final String FIVE_MIN_RAINFALL = "PN05";
    
    // 新增标准数据元素 - 根据SL651-2014附录C表C.1
    public static final String ELEM_TEMPERATURE = "T";       // 温度
    public static final String ELEM_WIND_DIRECTION = "WD";   // 风向
    public static final String ELEM_WIND_SPEED = "WS";       // 风速
    public static final String ELEM_PRESSURE = "PA";         // 气压
    public static final String ELEM_VISIBILITY = "VI";       // 可见度
    public static final String ELEM_TEMPERATURE_AI = "AI";    // 瞬时气温
    public static final String ELEM_WATER_TEMP_C = "C";       // 瞬时水温 
    public static final String ELEM_WIND_DIRECTION_UC = "UC"; // 风向
    public static final String ELEM_WIND_FORCE_UE = "UE";     // 风力(级)
    public static final String ELEM_WIND_SPEED_US = "US";     // 风速
    public static final String ELEM_EVAPORATION_EJ = "EJ";    // 当前蒸发
    public static final String ELEM_PRESSURE_FL = "FL";       // 气压
    public static final String ELEM_HUMIDITY_MST = "MST";     // 湿度
    public static final String ELEM_GROUND_TEMP_GTP = "GTP";  // 地温
    
    // 降水量相关元素
    public static final String ELEM_1H_RAINFALL_P1 = "P1";    // 1小时时段降水量
    public static final String ELEM_2H_RAINFALL_P2 = "P2";    // 2小时时段降水量
    public static final String ELEM_3H_RAINFALL_P3 = "P3";    // 3小时时段降水量
    public static final String ELEM_6H_RAINFALL_P6 = "P6";    // 6小时时段降水量
    public static final String ELEM_12H_RAINFALL_P12 = "P12"; // 12小时时段降水量
    public static final String ELEM_DAILY_RAINFALL_PD = "PD"; // 日降水量
    
    // 水位相关元素
    public static final String ELEM_UPSTREAM_LEVEL_ZU = "ZU";  // 库(闸、站)上水位
    public static final String ELEM_DOWNSTREAM_LEVEL_ZB = "ZB"; // 库(闸、站)下水位
    
    // 流量相关元素 
    public static final String ELEM_TOTAL_OUT_FLOW_QA = "QA";  // 总出库流量、过闸总流量
    public static final String ELEM_GATE_FLOW_QZ = "QZ";       // 输水设备流量、过闸(组)流量
    
    // 水质相关元素
    public static final String ELEM_REDOX_REDOX = "REDOX";     // 氧化还原电位
    public static final String ELEM_NH4N_NH4N = "NH4N";       // 氨氮
    public static final String ELEM_TP_TP = "TP";             // 总磷
    public static final String ELEM_TN_TN = "TN";             // 总氮
    
    // 设备状态相关
    public static final String ELEM_STATUS_ZT = "ZT";         // 遥测站状态及报警信息
    public static final String ELEM_GATE_HEIGHT_GH = "GH";    // 闸坝、水库闸门开启高度
    
    // 时间序列数据
    public static final String ELEM_DRZ2 = "DRZ2";            // 1小时内5分钟间隔相对水位2
    public static final String ELEM_DRZ3 = "DRZ3";            // 1小时内5分钟间隔相对水位3
    public static final String ELEM_DRZ4 = "DRZ4";            // 1小时内5分钟间隔相对水位4
    
    // 媒体数据元素
    public static final String ELEM_PICTURE = "PIC";           // 图片标识
    public static final String ELEM_VIDEO = "VID";             // 视频标识
    public static final String ELEM_CONFIG = "CFG";            // 配置信息
    public static final String ELEM_INTERVAL = "INT";          // 时间间隔

    //自定义
    public static final String DEVICE_TEMPERATURE = "DEVICE_TEMPERATURE";// 设备温度
    public static final String SIGNAL_STRENGTH = "SIGNAL_STRENGTH"; // 信号强度
    public static final String STATION_STATUS = "STATION_STATUS"; // 遥测站状态
    
    // 渗压数据相关元素
    public static final String SEEPAGE_WATER_LEVEL = "SEEPAGE_WATER_LEVEL"; // 渗压水位
    public static final String SEEPAGE_PRESSURE = "SEEPAGE_PRESSURE"; // 渗压值
    public static final String SEEPAGE_TEMPERATURE = "SEEPAGE_TEMPERATURE"; // 渗压温度
    public static final String SEEPAGE_MODULUS = "SEEPAGE_MODULUS"; // 渗压模数
    
    // 报文结构长度定义
    public static final int START_BYTE_LENGTH = 1;             // 起始符长度
    public static final int CENTER_ADDR_LENGTH = 2;            // 中心站地址长度
    public static final int STATION_ADDR_LENGTH = 10;          // 遥测站地址长度
    public static final int PASSWORD_LENGTH = 4;               // 密码长度
    public static final int FUNCTION_CODE_LENGTH = 2;          // 功能码长度
    public static final int FLAG_LENGTH_LENGTH = 4;            // 标识符和长度字段长度
    public static final int DATA_START_LENGTH = 1;             // 数据起始符长度
    public static final int SERIAL_NUMBER_LENGTH = 4;          // 流水号长度
    public static final int REPORT_TIME_LENGTH = 12;           // 发报时间长度
    public static final int DATA_END_LENGTH = 1;               // 数据结束符长度
    public static final int CRC_LENGTH = 4;                    // CRC校验码长度
    
    // 固定长度位置定义
    public static final int POS_START = 0;                     // 起始符位置
    public static final int POS_CENTER_ADDR = 1;               // 中心站地址位置
    public static final int POS_STATION_ADDR = 3;              // 遥测站地址位置
    public static final int POS_PASSWORD = 13;                 // 密码位置
    public static final int POS_FUNCTION_CODE = 17;            // 功能码位置
    public static final int POS_FLAG_LENGTH = 19;              // 标识符和长度位置
    public static final int POS_DATA_START = 23;               // 数据起始符位置
    public static final int POS_DATA_CONTENT = 24;             // 数据内容起始位置
    
    // 报文类型定义
    public enum MessageType {
        UPLINK,     // 上行报文
        DOWNLINK    // 下行报文
    }
    
    // 编码格式定义
    public enum EncodingType {
        ASCII,      // ASCII编码
        HEX         // HEX编码
    }
}